package com.duqc.designpattern.responsibility;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName FilterChain
 * @Description 责任链模式（第三步：定义一个过滤器的控制器）
 * @Author duqc
 * @Date 2021/5/7
 **/
public class FilterChain {
    /**
     * 使用list装过滤器，list是有序的
     */
    private List<Filter> filters = new ArrayList<>();
    /**
     * 过滤器的下标，从0开始，每次调用prehandleRequest方法就+1
     */
    private int index = 0;

    /**
     * 添加过滤器
     * @param filter
     */
    public void addFilter(Filter filter) {
        filters.add(filter);
    }

    /**
     * 调用过滤器的doFilter()方法，并把指针+1指向下一个过滤器
     * @param data
     * @return
     */
    public String prehandleRequest(String data) {
        //如果指针大于集合的size，则return，不再往下调用，相当于递归的终结条件
        if (index == filters.size()) {
            return data;
        }
        //Filter中可扩展中途暂停、跳过当前环节
        Filter filter = filters.get(index);
        //下标指针+1
        index++;
        //精髓在这个this，把自己当做参数传递进去，实现递归
        return filter.doFilter(data, this);
    }
}
